Komponenta pro zadavani datumu

Otázka od: Karel Pecinka

18. 11. 2004 16:13

Zdar,
 
poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli umozni
zadavat rychle datum z klavesnice (napr. 1710 bude 17.10. a doplni se
rok, 17 bude 17. 10. a doplni se aktualni mesic a rok atd.)? Nebylo by
ani spatny kdyby mel uzivatel i alternativni variantu rozbalit si
graficky kalendar podobne jako to ma datetimepicker, ale to uz neni tak
potreba. A kdyby ta komponenta byla rovnou db, tak by to byla uplne
parada, ale to uz bych si eventuelne pridal.
 
Diky za tipy.

Karel

Odpovedá: Jiri Cincura

18. 11. 2004 16:41

Karel Pecinka wrote:
> Zdar,
>
> poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli umozni zadavat
> rychle datum z klavesnice (napr. 1710 bude 17.10. a doplni se rok, 17
> bude 17. 10. a doplni se aktualni mesic a rok atd.)? Nebylo by ani spatny

A co na to pouzit TMaskEdit? Ten ti ty tecky doplni a event. i mesice, pokud
si to nastavis pri startu.

--
  Jiri Cincura
  e-mail: mailto:jiri@cincura.net; | http://www.cincura.net/
  mailto:xcincura@informatics.muni.cz | http://photo.cincura.net/
   ICQ: 314711544 | http://phorum.cincura.net/
 ---
  And if our times are difficult and perplexing,
  so are they challenging and filled with opportunity.
                                            -Robert F. Kennedy, 1961



Odpovedá: Karel Pecinka

18. 11. 2004 16:30

MaskEdit neprovadi kontrolu zadani spravnosti datumu, napr. umozni zadat
5. 13. atd.


> A co na to pouzit TMaskEdit? Ten ti ty tecky doplni a event.
> i mesice, pokud si to nastavis pri startu.


Odpovedá: Jiri Cincura

18. 11. 2004 16:58

Karel Pecinka wrote:
> MaskEdit neprovadi kontrolu zadani spravnosti datumu, napr. umozni zadat
> 5. 13. atd.

To je pravda. Musel by sis to osefovat sam.  

--
  Jiri Cincura
  e-mail: mailto:jiri@cincura.net; | http://www.cincura.net/
  mailto:xcincura@informatics.muni.cz | http://photo.cincura.net/
   ICQ: 314711544 | http://phorum.cincura.net/
 ---
  And if our times are difficult and perplexing,
  so are they challenging and filled with opportunity.
                                            -Robert F. Kennedy, 1961



Odpovedá: hlas

18. 11. 2004 16:42

ja pouzivam klasicku komponentu dbedit a vedla je tlacitko na kalendar
mam to osetrene tak, ze ak dojde k chybnemu vstupu procedura to
osetri tak ze sa z toho pokusi urobit datum najblizsi tomu vstupu
co nenajde do plni ako now.

napr z 15 spravi 15.11.2004
z 11*10 spravi 11.10.2004
z 11u12 spravi 11.12.2004 atd

strazi to jedina procedura:


procedure THform.MyException(Sender:TObject; E:Exception);
var wRok, wMesiac, wDen, wH, wM, wS, wMS: word;
    i, sepCount, Pos1, Pos2, Pos3: byte;
    DateStr, TimeStr, PomS, ZalohaS, Hod, Min, Sec: String;
 var ABC: String;
 F: TextFile;
begin
  if (E.ClassType.ClassName='EConvertError') then
  begin
    if Sender is TDBEdit then
    begin
      with Sender as TDBEdit do
      begin
       if DataSource.DataSet.FieldByName(DataField).DataType=ftDate then
       begin
         decodedate(now,wRok,wMesiac,wDen);
         SepCount := 0; // pocet separatorov =0
         Pos1:=0; // pozicia 1. separatora=0
         Pos2:=0; // pozicia 2. separatora=0
         Pos3:=0; // pozicia 3. separatora=0
         DateStr:=Text; // premennna datestr obsahuje datum, ktory sa
opravi
         // nasl. cyklus zameni vs.ine znaky ako cisla 0-9 za '.' ako
separator
         // a poznamena pozicie prvych troch separatorov
         for i := 1 to Length(DateStr) do
           if not (DateStr[i] in ['0'..'9']) then
           begin
             DateStr[i] := '.'; //DateSeparator;
             inc(SepCount);
             case sepCount of
               3: Pos3:=i;
               2: Pos2:=i;
               1: Pos1:=i;
             end;
           end;
         // vsetko za tretim separatorom zmaze - napr 11.3.2000.xxx.xxx.xx
         // vratane tretieho separatora a pocet separatorov nastavi na 2
         if SepCount>2 then
         begin
           Delete(DateStr, Pos3-1, Length(DateStr)-Pos3+1);
           SepCount:=2;
         end;
         // doplni chybajuce casti aktualnym mesiacom a rokom
         case sepCount of
           0: DateStr:=DateStr+'.'+IntToStr(wMesiac)+'.'+IntToStr(wRok);
           1: begin
                if Pos1<Length(DateStr) then
                  DateStr:=DateStr+'.'+IntToStr(wRok)
                else
                  DateStr:=DateStr+IntToStr(wMesiac)+'.'+IntToStr(wRok);
              end;
           2: begin
                if Pos2=Length(DateStr) then
                  DateStr:=DateStr+IntToStr(wRok);
                if Pos2-Pos1=1 then
                  Insert(IntToStr(wMesiac),DateStr,Pos2);
              end;
         end;
         // ak je iny znak na 1. mieste ako cislo tak to cele vymaze
         if Pos1=1 then DateStr:='';
         // vlozi vysledok do bdeditu
         Text:=DateStr;
       end;

  end
  else
  begin
    Application.ShowException(E); {let Delphi take it from here}
  end;
end;



Odpovedá: Ludek ZITA

19. 11. 2004 3:03

 On Behalf Of Karel Pecinka
> poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli
> umozni zadavat rychle datum z klavesnice (napr. 1710 bude
> 17.10. a doplni se rok, 17 bude 17. 10. a doplni se aktualni
> mesic a rok atd.)? Nebylo by ani spatny kdyby mel uzivatel i
> alternativni variantu rozbalit si graficky kalendar podobne
> jako to ma datetimepicker, ale to uz neni tak potreba. A
> kdyby ta komponenta byla rovnou db, tak by to byla uplne
> parada, ale to uz bych si eventuelne pridal.

Ahoj,
Mne se libi TEditSinea (viz. sada freeware komponent Sinea VCL pro
Delphi s uplnymi zdroji na www.sinea.cz)
(EditType = ttDate)

Ludek


Odpovedá: Petr Gregor

19. 11. 2004 7:49

Tady je kousek kodu, ktery resi tvorbu data v normalnim TEdit.
Doplnte si to do nejake sve komponenty.
Vystupem je datum ve formatu d.m.yyyy

Petr

try
  sText := Text;
  while Pos(',', sText) > 0 do //nahrad pripadne carky za tecky
    begin
      nPozice := Pos(',', sText);
      Delete(sText,nPozice,1);
      Insert('.',sText,nPozice);
    end;
  If Length(sText) = 1 Then
    begin //v pripade ze retezec je jen jeden znak dlouhy dopln tecku a
mesic a rok
      sText := sText + '.'+
IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) = 2) AND ( Pos('.',sText)=0) ) then
    begin //v pripade ze retezec je dva znaky dlouhy a neobsahuje tecku tak
dopln tecku a mesic a rok
      sText := sText + '.'+
IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date))
    end
  Else If ((Length(sText) = 2) AND (Pos('.',sText)>0) ) Then
    begin //v pripade ze retezec je dva znaky a dlouhy a obsahuje tecku tak
dopln mesic a rok
      sText := sText + IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) = 3) AND (Pos('.',sText)=2) ) Then
    begin //v pripade ze retezec je tri znaky a dlouhy a obsahuje tecku na
druhem miste tak dopln tecku a rok
      sText := sText + '.'+IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) = 3) AND (Pos('.',sText)=3) ) Then
    begin //v pripade ze retezec je tri znaky a dlouhy a obsahuje tecku na
tretim miste tak dopln mesic a rok
      sText := sText + IntToStr(MonthOf(Date))+'.'+IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) = 4) AND (Pos('.',sText)=3) ) Then
    begin //v pripade ze retezec je ctyri znaky a dlouhy a obsahuje tecku na
tretim miste tak dopln tecku a rok
      sText := sText + '.'+IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) = 4) AND (Pos('.',sText)=4) ) Then
    begin //v pripade ze retezec je ctyri znaky a dlouhy a obsahuje tecku na
ctvrtem miste tak dopln rok
      sText := sText + IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) = 6) AND (sText[6]='.') ) Then
    begin //v pripade ze retezec je sest znaku a dlouhy a obsahuje tecku na
sestem miste tak dopln rok
      sText := sText + IntToStr(YearOf(Date));
    end
  Else If ((Length(sText) < 6) AND (Pos('.',sText)=0)) then
    begin //pokud je retezec dlouhy mene nez 6 znaku a neobsahuje jednu
tecku tak dopln dnesni datum
      sText := DateToStr(Date);
    end
  Else If ((Length(sText) < 6) AND (Pos('.',sText)> 0)) then
    begin //pokud je retezec dlouhy mene nez 6 znaku a obsahuje jednu tecku
tak dopln rok
      sText := sText + '.'+IntToStr(YearOf(Date));
    end;
  If Pos('..', sText) > 0 Then
    begin //pokud doslo ke zdvojeni tecky tak to oprav
      nPozice := Pos('..', sText);
      Delete(sText,nPozice,1);
    end;
  Text := sText;
  StrToDate(Text);
Except
  begin
    
MessageDlg('Vlozeny udaj neni platnym datem. Nastavuji dnesni
datum.',mtError,
[mbOK],0);
    Text := DateToStr(Date);
    SetFocus;
    Exit;
  end;

 On Behalf Of Karel Pecinka
> poradite nekdo nejakou sikovnou kompoentu, ktera uzivateli umozni
> zadavat rychle datum z klavesnice (napr. 1710 bude 17.10. a doplni se
> rok, 17 bude 17. 10. a doplni se aktualni mesic a rok atd.)? Nebylo by
> ani spatny kdyby mel uzivatel i alternativni variantu rozbalit si
> graficky kalendar podobne jako to ma datetimepicker, ale to uz neni
> tak potreba. A kdyby ta komponenta byla rovnou db, tak by to byla
> uplne parada, ale to uz bych si eventuelne pridal.